<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
	<title>绘画</title>
	<style>
		* {
		    margin: 0;
		    padding: 0;
		}
		html {
		    overflow: hidden;
		}
	</style>
</head>
<body>
	
<script src='three.js'></script>
<script>
// This THREEx helper makes it easy to handle window resize.
// It will update renderer and camera when window is resized.
//
// # Usage
//
// **Step 1**: Start updating renderer and camera
//
// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)```
//    
// **Step 2**: Start updating renderer and camera
//
// ```windowResize.stop()```
// # Code

//

/** @namespace */
var THREEx	= THREEx 		|| {};

/**
 * Update renderer and camera when the window is resized
 * 
 * @param {Object} renderer the renderer to update
 * @param {Object} Camera the camera to update
*/
THREEx.WindowResize	= function(renderer, camera){
	var callback	= function(){
		// notify the renderer of the size change
		renderer.setSize( window.innerWidth, window.innerHeight );
		// update the camera
		camera.aspect	= window.innerWidth / window.innerHeight;
		camera.updateProjectionMatrix();
	}
	// bind the resize event
	window.addEventListener('resize', callback, false);
	// return .stop() the function to stop watching window resize
	return {
		/**
		 * Stop watching window resize
		*/
		stop	: function(){
			window.removeEventListener('resize', callback);
		}
	};
}
</script>
<script src='OrbitControls.js'></script>

<script>
var colors = [
    0xFF62B0,
    0x9A03FE,
    0x62D0FF,
    0x48FB0D,
    0xDFA800,
    0xC27E3A,
    0x990099,
    0x9669FE,
    0x23819C,
    0x01F33E,
    0xB6BA18,
    0xFF800D,
    0xB96F6F,
    0x4A9586
];
var particleLight;

var lesson1 = {
    scene: null,
    camera: null,
    renderer: null,
    container: null,
    controls: null,
    clock: null,

    init: function() { // Initialization

        // 创建主场景
        this.scene = new THREE.Scene();

        var SCREEN_WIDTH = window.innerWidth,
            SCREEN_HEIGHT = window.innerHeight;

        // 准备相机
        var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 1, FAR = 10000;
        this.camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
        this.scene.add(this.camera);
        this.camera.position.set(-1000, 1000, 0);
        this.camera.lookAt(new THREE.Vector3(0,0,0));

        // 准备渲染
        this.renderer = new THREE.WebGLRenderer({antialias:true, alpha: false});
        this.renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
        this.renderer.setClearColor(0xffffff);

        this.renderer.shadowMapEnabled = true;
        this.renderer.shadowMapSoft = true;

        // 准备容器
        this.container = document.createElement('div');
        document.body.appendChild(this.container);
        this.container.appendChild(this.renderer.domElement);

        // events
        THREEx.WindowResize(this.renderer, this.camera);

        // 准备控制器
        this.controls = new THREE.OrbitControls(this.camera, this.renderer.domElement);
        this.controls.target = new THREE.Vector3(0, 0, 0);

        // 准备计时器
        this.clock = new THREE.Clock();

        // 添加定向光线，添加基本的阴影
        var dLight = new THREE.DirectionalLight(0xffffff);
        dLight.position.set(1, 1000, 1);
        dLight.castShadow = true;
        dLight.shadowCameraVisible = true;
        dLight.shadowDarkness = 0.2;
        dLight.shadowMapWidth = dLight.shadowMapHeight = 1000;
        this.scene.add(dLight);

        // 添加粒子光线
        particleLight = new THREE.Mesh( new THREE.SphereGeometry(10, 10, 10), new THREE.MeshBasicMaterial({ color: 0x44ff44 }));
        particleLight.position = dLight.position;
        this.scene.add(particleLight);

        // 添加简单的场地
        var groundGeometry = new THREE.PlaneGeometry(1000, 1000, 1, 1);
        ground = new THREE.Mesh(groundGeometry, new THREE.MeshLambertMaterial({
            color: this.getRandColor()
        }));
        ground.position.y = 0;
        ground.rotation.x = - Math.PI / 2;
        ground.receiveShadow = true;
        this.scene.add(ground);

        // 添加圆形
        var circle = new THREE.Mesh(new THREE.CircleGeometry(70, 50), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        circle.rotation.x = - Math.PI / 2;
        circle.rotation.y = - Math.PI / 3;
        circle.rotation.z = Math.PI / 3;
        circle.position.x = -300;
        circle.position.y = 150;
        circle.position.z = -300;
        circle.castShadow = circle.receiveShadow = true;
        this.scene.add(circle);

        // 添加方块
        var cube = new THREE.Mesh(new THREE.CubeGeometry(100, 100, 100), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        cube.rotation.x = cube.rotation.z = Math.PI * 0.1;
        cube.position.x = -300;
        cube.position.y = 150;
        cube.position.z = -100;
        cube.castShadow = cube.receiveShadow = true;
        this.scene.add(cube);

        // 添加圆柱
        var cube = new THREE.Mesh(new THREE.CylinderGeometry(60, 80, 90, 32), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        cube.rotation.x = cube.rotation.z = Math.PI * 0.1;
        cube.position.x = -300;
        cube.position.y = 150;
        cube.position.z = 100;
        cube.castShadow = cube.receiveShadow = true;
        this.scene.add(cube);

        // 添加不规则物体
        var extrudeSettings = {
            amount: 10,
            steps: 10,
            bevelSegments: 10,
            bevelSize: 10,
            bevelThickness: 10
        };
        var triangleShape = new THREE.Shape();
        triangleShape.moveTo(  0, -50 );
        triangleShape.lineTo(  -50, 50 );
        triangleShape.lineTo( 50, 50 );
        triangleShape.lineTo(  0, -50 );

        var extrude = new THREE.Mesh(new THREE.ExtrudeGeometry(triangleShape, extrudeSettings), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        extrude.rotation.y = Math.PI / 2;
        extrude.position.x = -300;
        extrude.position.y = 150;
        extrude.position.z = 300;
        extrude.castShadow = extrude.receiveShadow = true;
        this.scene.add(extrude);

        // 添加二十面体
        var icosahedron = new THREE.Mesh(new THREE.IcosahedronGeometry(70), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        icosahedron.position.x = -100;
        icosahedron.position.y = 150;
        icosahedron.position.z = -300;
        icosahedron.castShadow = icosahedron.receiveShadow = true;
        this.scene.add(icosahedron);

        // 添加八面体
        var octahedron = new THREE.Mesh(new THREE.OctahedronGeometry(70), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        octahedron.position.x = -100;
        octahedron.position.y = 150;
        octahedron.position.z = -100;
        octahedron.castShadow = octahedron.receiveShadow = true;
        this.scene.add(octahedron);

        // 添加环
        var ring = new THREE.Mesh(new THREE.RingGeometry(30, 70, 32), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        ring.rotation.y = -Math.PI / 2;
        ring.position.x = -100;
        ring.position.y = 150;
        ring.position.z = 100;
        ring.castShadow = ring.receiveShadow = true;
        this.scene.add(ring);

        // 几何结构
        var shapeG = new THREE.Mesh(new THREE.ShapeGeometry(triangleShape), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        shapeG.rotation.y = -Math.PI / 2;
        shapeG.position.x = -100;
        shapeG.position.y = 150;
        shapeG.position.z = 300;
        shapeG.castShadow = shapeG.receiveShadow = true;
        this.scene.add(shapeG);

        // 添加球体
        var sphere = new THREE.Mesh(new THREE.SphereGeometry(70, 32, 32), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        sphere.rotation.y = -Math.PI / 2;
        sphere.position.x = 100;
        sphere.position.y = 150;
        sphere.position.z = -300;
        sphere.castShadow = sphere.receiveShadow = true;
        this.scene.add(sphere);

        // 添加四面体
        var tetrahedron = new THREE.Mesh(new THREE.TetrahedronGeometry(70), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        tetrahedron.position.x = 100;
        tetrahedron.position.y = 150;
        tetrahedron.position.z = -100;
        tetrahedron.castShadow = tetrahedron.receiveShadow = true;
        this.scene.add(tetrahedron);

        // 添加圆环
        var torus = new THREE.Mesh(new THREE.TorusGeometry(70, 20, 16, 100), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        torus.rotation.y = -Math.PI / 2;
        torus.position.x = 100;
        torus.position.y = 150;
        torus.position.z = 100;
        torus.castShadow = torus.receiveShadow = true;
        this.scene.add(torus);

        // 添加圆环管
        var torusK = new THREE.Mesh(new THREE.TorusKnotGeometry(70, 20, 16, 100), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        torusK.rotation.y = -Math.PI / 2;
        torusK.position.x = 100;
        torusK.position.y = 150;
        torusK.position.z = 300;
        torusK.castShadow = torusK.receiveShadow = true;
        this.scene.add(torusK);

        // 添加不规则圆环结管
        var points = [];
        for (var i = 0; i < 10; i++) {
            var randomX = -100 + Math.round(Math.random() * 200);
            var randomY = -100 + Math.round(Math.random() * 200);
            var randomZ = -100 + Math.round(Math.random() * 200);

            points.push(new THREE.Vector3(randomX, randomY, randomZ));
        }
        var tube = new THREE.Mesh(new THREE.TubeGeometry(new THREE.SplineCurve3(points), 64, 20), new THREE.MeshLambertMaterial({ color: this.getRandColor() }));
        tube.rotation.y = -Math.PI / 2;
        tube.position.x = 0;
        tube.position.y = 500;
        tube.position.z = 0;
        tube.castShadow = tube.receiveShadow = true;
        this.scene.add(tube);
    },
    getRandColor: function() {  //随机返回一个预定义的颜色
        return colors[Math.floor(Math.random() * colors.length)];
    }
};

// Animate the scene
function animate() {
    requestAnimationFrame(animate);
    render();
    update();
}

// Update controls
function update() {
    lesson1.controls.update(lesson1.clock.getDelta());

    // smoothly move the particleLight
    var timer = Date.now() * 0.000025;
    particleLight.position.x = Math.sin(timer * 5) * 300;
    particleLight.position.z = Math.cos(timer * 5) * 300;
}

// Render the scene
function render() {
    if (lesson1.renderer) {
        lesson1.renderer.render(lesson1.scene, lesson1.camera);
    }
}

// Initialize lesson on page load
function initializeLesson() {
    lesson1.init();
    animate();
}

if (window.addEventListener)
    window.addEventListener('load', initializeLesson, false);
else if (window.attachEvent)
    window.attachEvent('onload', initializeLesson);
else window.onload = initializeLesson;

</script>

</body>
</html>